<?php
/*
	파일명: Latest.class.php
	제작자: 박경종(너굴군)
	제작일시: 2008-06-20
	최종업데이트: 2008-06-20
	이메일: kevinpark1981@gmail.com
	홈페이지: http://bequietzero.com
*/

include_once '_common.php';	// 그누보드를 위한 인크루드..
include_once 'interface.php';

/*	클래스: Latest
	버전: 1.0
	PHP버전: 5.0 이상
	설명: 추상 클래스로 최근게시글을 총괄한다. 전체최근게시글, 그룹별 최근게시글, 게시판별 최근게시글, 최근코멘트, 내가쓴글의 최근 코멘트
*/
abstract class Latest implements ILatest
{
	protected $style;		//< 스타일 저장
	protected $script;		//< 스크립트 저장
	protected $classPath;	//< 클래스 경로

	protected $list;		//< 출력될 리스트
	protected $cutSubject;	//< 출력될 제목 길이 조절

    protected $listGroup;
    protected $listBoard;
    protected $unlistGroup;
    protected $unlistBoard;
    protected $viewReply;
    protected $viewComment;
    protected $mb_id;

	/*	템플릿 메소드: view
		설명: 최근게시글 HTML코드를 반환해 준다.
		파라미터:	$rows - 출력할 행 수
	*/
	final function view($rows) {
		$this->query($rows);
        if(count($this->list)!=0) {
            $this->addStyle();
            $this->addScript();
        }
		return $this->createHTML();
	}

    final public function setUnlist($unlistGroup, $unlistBoard){
        $this->unlistGroup = $unlistGroup;
        $this->unlistBoard = $unlistBoard;
        DEBUG('','',$this->unlistBoard);
    }
    final public function setList($listGroup, $listBoard){
        $this->listGroup = $listGroup;
        $this->listBoard = $listBoard;
    }
    final public function viewReply($reply){
        $this->viewReply = $reply;
    }
    final public function viewComment($comment){
        $this->viewComment = $comment;
    }

    public function reset() {

        $this->list = array();
        $this->cutSubject = 0;
        $this->mb_id = '';

        $this->listGroup = array();
        $this->listBoard = array();
        $this->unlistGroup = array();
        $this->unlistBoard = array();
        $this->viewReply = array();
        $this->viewComment = array();
    }

    final public function member($mb_id) {
        $this->mb_id = $mb_id;
    }

	/*	함수: query	
		설명: 쿼리를 실행해 $list에 목록을 저장한다. 다른 형태의 퀴리를 원하면 하위클래스에서 재정의 가능하다.
	*/
	abstract protected function query($rows);/* {
		global $g4;

		// 전체 최신글
		$sql = "SELECT N.bo_table, N.wr_id, DATE_FORMAT(N.bn_datetime, '%y.%c.%e(%k:%i)') as bn_datetime
			FROM $g4[board_new_table] N, $g4[board_table] B, $g4[group_table] G 
			WHERE N.bo_table = B.bo_table AND G.gr_id = B.gr_id ";

		if(!$viewComment) $sql .= " AND N.wr_id = N.wr_parent ";

		for($i=0; $i<count($unlistGroup); $i++) {
			$sql .= " AND G.gr_subject <> '$unlistGroup[$i]' ";
		}

		for($i=0; $i<count($unlistBoard); $i++) {
			$sql .= " AND B.bo_subject <> '$unlistBoard[$i]' ";
		}
		$sql .=	" order by N.bn_datetime desc ";
		$list = sql_query($sql);

		$k=0;
		for ($i=0;$k<$rows && $row = sql_fetch_array($list); $i++) {
			$sql = "SELECT `wr_subject` FROM `$g4[write_prefix]$row[bo_table]` WHERE `wr_id`=$row[wr_id] ";
			$sql .= " AND wr_option <> 'secret' ";	// 비밀글 보여주지 않기
			if(!$viewReply) $sql .= " AND wr_reply <> 'A' "; // 답글 보여주지 않기
			$wr = sql_fetch($sql);
			if(count($wr[wr_subject])!=0) {
				$this->list[$k] = array();
				$this->list[$k][bo_table] = $row[bo_table];
				// 제목길이 조절
				if($this->cutSubject!=0)	$this->list[$k][wr_subject] = conv_subject($wr[wr_subject], $this->cutSubject, "…");
				else $this->list[$k][wr_subject] = $wr[wr_subject];
				$this->list[$k][wr_id] = $row[wr_id];
				$this->list[$k][bn_datetime] = $row[bn_datetime];
				$k++;
			}
		}
	}*/

	/*	함수: createHTML
		설명: 페이지에 삽입될 html소스를 생성한다. 기본적으로 ul li리스트를 생성한다.
	*/
	abstract protected function createHTML();/* {
		global $g4;
		$result = '';
		for($i=0; $i<count($this->list); $i++) {
			$result .= "<div class='latestAll'>";
			$result .= "<ul><li>";
			$result .= "<a href='$g4[bbs_path]/board.php?bo_table={$this->list[$i][bo_table]}&wr_id={$this->list[$i][wr_id]}'>{$this->list[$i][wr_subject]}</a>";
			$result .= "<i> - update: {$this->list[$i][bn_datetime]}</i>";
			$result .= "</li></ul>";
			$result .= "</div>";
		}
		if($result!='') $this->addStyle();
		return $result;
	}*/

	// 스타일과 스크립트 정의
	abstract protected function addStyle();
   	abstract protected function addScript();


	// 생성자와 소멸자
	protected function __construct($classPath) { // 생성자
        $this->reset();
		$this->classPath = $classPath;
	}

	function __destruct() {	// 소멸자
		echo $this->style.$this->script;
	}

	// setter and getter 제어해야 할 일이 있을때 쓰자.
	//function __get($name) {return $this->$name;}
	//function __set($name, $value) {$this->$name = $value;}
}


/*	버전 히스토리	
-----------------------------------------------------------

	버전1.1:2008-07-17
	-------------------------------------------------------
        싱글톤 클래스 구현 완전한 추상 클래스로 구현
        html, query, style 부분은 하위클래스에서 무조건 구현해야 함

	버전1.0:2008-06-20
	-------------------------------------------------------
		최근 게시글의 종합 상위클래스
-----------------------------------------------------------
*/

/* 버전 1.0 함수 임시저장

/*	함수: latestAll
	설명: 전체 게시판을 검색하여 최신글을 출력한다. 출력시 제외할 그룹,게시판을 설정가능하다. 그리고 답글을 출력할지 안할지도 설정가능하다.
	파라미터:
		$skin_dir - 스킨명
		$rows - 출력할 갯수
		$unlistGroup - 출력하지 않을 그룹
		$unlistBoard - 출력하지 않을 게시판
		$unlistReply - 답글 출력여부 false 출력, true 출력안함
*
function latestAll($skin_dir="", $rows=10, $unlistGroup = array(), $unlistBoard = array(), $unlistReply = false) {

	global $g4;

    if ($skin_dir)
        $latestAll_skin_path = "$g4[path]/skin/gnuwiki/latestAll/$skin_dir";
    else
        $latestAll_skin_path = "$g4[path]/skin/gnuwiki/latestAll/basic";

	// 전체 최신글
	$sql = "SELECT N.bo_table, N.wr_id, DATE_FORMAT(N.bn_datetime, '%y.%c.%e(%k:%i)') as bn_datetime
		FROM $g4[board_new_table] N, $g4[board_table] B, $g4[group_table] G 
		WHERE N.wr_id = N.wr_parent AND N.bo_table = B.bo_table AND G.gr_id = B.gr_id ";

	for($i=0; $i<count($unlistGroup); $i++) {
		$sql .= " AND G.gr_subject <> '$unlistGroup[$i]' ";
	}

	for($i=0; $i<count($unlistBoard); $i++) {
		$sql .= " AND B.bo_subject <> '$unlistBoard[$i]' ";
	}

	$sql .=	" order by N.bn_datetime desc ";

	$list = sql_query($sql);


	ob_start();
	include "$latestAll_skin_path/latestAll.skin.php";
	$content = ob_get_contents();
	ob_end_clean();

    return $content;
}
*/


?>